package com.yh.service.other;

import com.yh.service.CinemaService;
import com.yh.service.OrderService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author yuhuan
 * @date 2022/01/13
 */
@Component
public class TimedTask {
    @DubboReference(check = false)
    private OrderService orderService;
    @DubboReference(check = false)
    private CinemaService cinemaService;

    /**
     * 定时检查并释放过期订单占用的座位，当前配置规则为每5分钟执行一次（数据库全表扫描）
     * 该定时任务的主要目的是为了清除因意外情况导致没有被处理的过期订单（正常情况下可以
     * 不启用，但是需要确保延时消息队列的消息不要丢失，一旦丢失将导致过期订单的占用的座
     * 位无法被释放）
     *
     * @Scheduled 开启定时任务，支持六个元素的'cron表达式'（不包含年的规则）
     * 一个cron表达式最少有5个空格来分割时间元素，总共有7个元素。分别代表秒、分、时、日、月、周、年（可选）
     * 例：
     * 1）   0/5 * * * * ? * （此时的'0/5'表示每五秒；数字在哪个时间位就表示哪个时间）
     * 2）   0 30 2,3,4 * * ? * （表示每天的2点30分、3点30分和4点30）
     * 参考学习地址：http://baijiahao.baidu.com/s?id=1713309001213068537
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void checkExpiredOrderAndReleaseSeat() {
        orderService.checkExpiredOrder();
    }


    /**
     * 每天9:00自动更新影片的播放计划
     */
    @Scheduled(cron = "0 0 9 * * ?")
    public void updateMovieShowTimeEveryDay() {
        List<Integer> movieIds = new ArrayList<>();
        movieIds.add(1);
        cinemaService.updateScheduleByDateAndMovieId(movieIds,new Date());
    }
}
